package com.example.demo.Controller;

import cn.hutool.json.JSONObject;
import com.example.demo.Entity.Note;
import com.example.demo.Entity.Result;
import com.example.demo.Service.NoteService;
import com.example.demo.Service.NoteServiceImp;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.ArrayList;
import java.util.List;

/**
 * 用户信息表前端操作接口
 **/
@RestController
@RequestMapping("note")
public class NoteController {

    @Autowired
    private NoteService noteService;


    /** 查询笔记 */
    @GetMapping("/selectByNoteId")
    public Note findByNoteId(@RequestParam Integer noteId) {
        return noteService.selectByNoteId(noteId);
    }

    /** 新增笔记 */
    @PostMapping("/insert")
    public void insertNote(@RequestBody Note note) {

        noteService.insertNote(note);
        System.out.println(Result.success());
    }
    /** 删除笔记 */
    @DeleteMapping("/{id}")
    public void delete(@PathVariable Integer id){
        noteService.removeById(id);
    }



    /*7.新增和修改
         需要传递body传递全部参数，
        7.1对数据的操作使用@PostMapping，括号里面不定义就代表使用post方式，url访问上面默认路径/user
        7.2自定义一个方法，括号里面使用(@RequestBody 属性类 自定义属性昵称)
        为什么这里fc用Boolean而不是User，因为对数据的修改希望返回的结果就两种，要么成功，要么失败，所以用布尔值
        @RequestBody这个注解用于映射传递来的json参数映射为到java对象里面，特别是适用与请求体的参数
        7.3然后再用服务层返回获取的saveOrUpdate方法就好了
    */
    /**更新或新增笔记*/
    @PostMapping("/update")
    public void saveOrUpdate(@RequestBody Note note){
        String tag= String.join(",", note.getTags());;
        note.setNoteTags(tag);
        noteService.saveOrUpdateNote(note);

    }

    /*
    *5.查询全部的数据
       5.1使用 @GetMapping注解，没有括号不定义就代表使用get方式，url访问上面默认路径/user
       5.2查询全部肯定使用的方法是集合<实体类>方式去自定义一个findAll方法名
       5.3再用服务层返回一个集合就好了
     */
    /**查找同一用户的所有笔记*/
    @GetMapping("/findByUser")
    public List<Note> findByUserId(@RequestParam Integer user_id){
        return noteService.findByUserId(user_id);
    }

    /**按标签搜索*/
    @PostMapping("/findByTag")
    public List<Note> findByTag(@RequestParam String tag){
    return noteService.selectByTags(tag);

    }
    /**按标题搜索*/
    @PostMapping("/findByTitle")
    public List<Note> findByTitle(@RequestParam String title){
        return noteService.selectByTitle(title);

    }

    /**按标题搜索*/
    @GetMapping("/find")
    public List<Note> find(@RequestParam String query,String content,String scope,Integer userId){
        String[] strArray = query.substring(1,query.length()-1).split(",");
        List<Integer> intArray = new ArrayList<Integer>();
        for (int i = 0; i < strArray.length; i++) {
            intArray.add(Integer.parseInt(strArray[i]));
        }
        return noteService.select(intArray,scope,content,userId);
    }

    /** 存储文件 */
    @PostMapping("/takeFile")
    public void takeFile(@RequestParam MultipartFile file) throws Exception {
         noteService.takeFile(file);
    }

    /** 下载文件 */
    @GetMapping("/download")
    public void download(@RequestParam String FileName, HttpServletResponse response) throws Exception {
        noteService.download(FileName,response);
    }

    /** 得到昵称和当前点赞数 */
    @GetMapping("/getDetail")
    public JSONObject getDetail(@RequestParam Integer noteId){
        return noteService.findNameById(noteId);
    }

    /** 笔记点赞 */
    @PostMapping("/upvote")
    public void upvote(@RequestParam Integer noteId) {
        noteService.upvote(noteId);
    }

    /** 笔记点赞 */
    @PostMapping("/cancelUpvote")
    public void cancelUpvote(@RequestParam Integer noteId) {
        noteService.cancelUpvote(noteId);
    }

    /** 查询所有历史版本笔记 */
    @GetMapping("/findAll")
    public List<Note> findAll(@RequestParam Integer noteId) {
        return noteService.findAll(noteId);
    }

    /** 查询最新版本笔记 */
    @GetMapping("/findNewVersion")
    public Note findNewVersion(@RequestParam Integer noteId) {
        return noteService.findByNoteId(noteId);
    }
}


